package cn.huaqingcheng.tool.json;

import cn.huaqingcheng.tool.core.DelayedInit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import java.util.function.Supplier;

/**
 * JsonTool
 */
@SuppressWarnings({"unused", "ClassNamePrefixedWithPackageName"})
public interface JsonTool {

    /**
     * 延迟到使用时加载, 避免意外的引入导致初始化时报错; <br>
     * 代价是会导致加载错误延迟到使用时才能发现
     */
    Supplier<JsonProvide> PROVIDE = new DelayedInit<>(() -> {
        ModuleLayer layer = JsonProvide.class.getModule().getLayer();
        return (layer == null ? ServiceLoader.load(JsonProvide.class) : ServiceLoader.load(layer, JsonProvide.class))
            .stream()
            .map(ServiceLoader.Provider::get)
            .sorted()
            .findFirst()
            .orElseThrow(() -> new ServiceConfigurationError("SPI 错误: 找不到 %s 实现".formatted(JsonProvide.class.getName())));
    });

    @NotNull
    static String toJson(@Nullable Object o) {
        return PROVIDE.get().toJson(o);
    }

    @NotNull
    static String toFormatJson(@Nullable Object o) {
        return PROVIDE.get().toFormatJson(o);
    }

    static <T> T parse(@Nullable String json, @NotNull Class<T> type) {
        return PROVIDE.get().parse(json, type);
    }

    static <E> List<E> parseList(@Nullable String json, @NotNull Class<E> type) {
        return PROVIDE.get().parseList(json, type);
    }

}
